package com.example.io;

import org.junit.Test;

import java.io.*;

/**
 * @author readpage
 * @create 2022-10-16 15:44
 * 对象流的使用
 * 1.ObjectInputStream 和 ObjectOutputStream
 * 2.作用: 用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可以把Java中的对象
 *   写入到数据源中，也能把对象从数据源中还原回来。
 * 3.要想一个java对象是可序列化的，需要满足相应的要求，见Person对象
 *
 * 补充: ObjectOutPutStream和ObjectInputStream不能序列化static和transient修饰的成员变量
 */

public class ObjectInputOutputStreamTest {
    /**
     * 序列化过程: 将内存中的java对象保存到磁盘中或通过网络传输出去
     * 使用ObjectOutputStream实现
     */
    @Test
    public void testObjectOutputStream() {
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream("object.dat"));
            oos.writeObject("你好呀！");
            oos.flush(); //刷新操作
            oos.writeObject(new Person("李明", 23));
            oos.flush();
            oos.writeObject(new Person("张三", 23, 1001, new Account(5000)));
            oos.flush();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (oos != null) {
                try {
                    oos.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

    /**
     * 反序列化: 将磁盘文件中的对象还原为内存中的一个Java对象
     * 使用ObjectInputStream实现
     */
    @Test
    public void testObjectInputStream() {
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream("object.dat"));

            Object str = ois.readObject();
            System.out.println(str);

            Person person = (Person) ois.readObject();
            Person person2 = (Person) ois.readObject();
            System.out.println(person);
            System.out.println(person2);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } finally {
            if (ois != null) {
                try {
                    ois.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }

    }
}
